package com.tuzhi.base.web.config;

import com.tuzhi.base.web.interceptor.UserInterceptor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.StringHttpMessageConverter;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

import java.nio.charset.Charset;
import java.util.List;

/**
 * 一个项目中只能有一个继承 WebMvcConfigurationSupport 的@Configuration类（使用@EnableMvc效果相同），
 * 如果存在多个这样的类，只有一个配置可以生效。推荐使用implements WebMvcConfigurer 的方法自定义mvc配置。
 * 不建议重写WebMvcConfigurationSupport，因为这样spring mvc会失效；
 * 一般用实现WebMvcConfigurer的方法来配置，并且是可以多个的；
 */
@Configuration
public class WebConfig implements WebMvcConfigurer {

    /* @Bean
     public HandlerInterceptor userInterceptor() {
         return new UserInterceptor();
     }*/
    @Autowired
    UserInterceptor userInterceptor;

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
      /*  //Swager静态资源映射配置
        registry.addResourceHandler("swagger-ui.html")
                .addResourceLocations("classpath:/META-INF/resources/");
        registry.addResourceHandler("doc.html")
                .addResourceLocations("classpath:/META-INF/resources/");
        registry.addResourceHandler("/webjars/**")
                .addResourceLocations("classpath:/META-INF/resources/webjars/");*/
        registry.addResourceHandler("/**")
                .addResourceLocations("classpath:/META-INF/resources/");
        registry.addResourceHandler("/webjars/**")
                .addResourceLocations("classpath:/META-INF/resources/webjars/");

    }

    /**
     * 在RsponseBody注解下，Spring处理返回值为String时会用到StringHttpMessageConverter，我们只需要在配置文件中设置好他的编译编码就ok了
     *
     * @return
     *//*
    @Bean
    public StringHttpMessageConverter stringHttpMessageConverter() {
        StringHttpMessageConverter httpMessageConverter = new StringHttpMessageConverter();
        httpMessageConverter.setDefaultCharset(Charset.defaultCharset());
        return httpMessageConverter;
    }*/

    //保证StringHttpMessageConverter在FastJsonHttpMessageConverter前被调用
    @Override
    public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
        // 框架默认的StringHttpMessageConverter编码是ISO-8859-1，@Response注解当接口返回的是字符串时会中文乱码
        // 请注意顺序，因为其实底层就是用list进行存储的所有可以通过指定下标来指定顺序
        // 目前这种写法可以解决问题，但是因为我们指定的StringHttpMessageConverter
        // 框架也指定了StringHttpMessageConverter，所有我们要将自己的排在前面，否者依然无法使用自定义的消息转换器
        for (HttpMessageConverter httpMessageConverter : converters) {
            if (httpMessageConverter instanceof StringHttpMessageConverter) {
                ((StringHttpMessageConverter) httpMessageConverter).setDefaultCharset(Charset.defaultCharset());
            }
        }
    }

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(userInterceptor)
                .addPathPatterns("/**");
    }
}
